package com.zpz.framework.zpzoauth.config.exception;

import com.zpz.framework.zpzoauth.common.result.ZpzOauthResultMsg;
import com.zpz.framework.zpzoauth.common.result.ZpzOauthResultStatus;
import org.springframework.boot.web.servlet.error.ErrorController;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * @author zhangpanzhi
 * @time 2019-07-09
 * @description 未经本人允许请勿随便改动，尊重劳动
 * */
@RestController
public class HttpErrorController implements ErrorController {

    private final static String ERROR_PATH = "/error";

    @ResponseBody
    @RequestMapping(path  = ERROR_PATH )
    public ResponseEntity<ZpzOauthResultMsg<Object>> error(HttpServletRequest request, HttpServletResponse response){
        ZpzOauthResultMsg<Object> error = ZpzOauthResultMsg.error("服务繁忙，请稍后再试");
        Exception exception = (Exception) request.getAttribute("javax.servlet.error.exception");
        int status = response.getStatus();
        if (exception == null){
            if (status==401) {
                error=ZpzOauthResultMsg.customResultStatus(ZpzOauthResultStatus.GATE_WAY_10053);
            }
        } else {
            String message1 = exception.getMessage();
            String oauth2Exception="@permissionService.hasPermission(request,authentication)";
            if (message1.contains(oauth2Exception)){
                Throwable cause = exception.getCause();
                Throwable cause1 = cause.getCause();
                String message = cause1.getMessage();
                if (message.contains("[ZPZ_DEFINED_OAUTH2_PREPOSITION_EXCEPTION]")){
                    if (message.contains("10039")){
                        error= ZpzOauthResultMsg.customResultStatus(ZpzOauthResultStatus.GATE_WAY_10039);
                    }else if (message.contains("10024")){
                        error=ZpzOauthResultMsg.customResultStatus(ZpzOauthResultStatus.GATE_WAY_10024);
                    }else if (message.contains("10023")){
                        error=ZpzOauthResultMsg.customResultStatus(ZpzOauthResultStatus.GATE_WAY_10023);
                    }else if (message.contains("10026")){
                        error=ZpzOauthResultMsg.customResultStatus(ZpzOauthResultStatus.GATE_WAY_10026);
                    }else if (message.contains("10028")){
                        error=ZpzOauthResultMsg.customResultStatus(ZpzOauthResultStatus.GATE_WAY_10028);
                    }else if (message.contains("10027")){
                        error=ZpzOauthResultMsg.customResultStatus(ZpzOauthResultStatus.GATE_WAY_10027);
                    }else if (message.contains("10035")){
                        error=ZpzOauthResultMsg.customResultStatus(ZpzOauthResultStatus.GATE_WAY_10035);
                    }else if (message.contains("10036")){
                        error=ZpzOauthResultMsg.customResultStatus(ZpzOauthResultStatus.GATE_WAY_10036);
                    }else if (message.contains("10038")){
                        error=ZpzOauthResultMsg.customResultStatus(ZpzOauthResultStatus.GATE_WAY_10038);
                    }else if (message.contains("10037")){
                        error=ZpzOauthResultMsg.customResultStatus(ZpzOauthResultStatus.GATE_WAY_10037);
                    }else if (message.contains("10050")){
                        error=ZpzOauthResultMsg.customResultStatus(ZpzOauthResultStatus.GATE_WAY_10050);
                    }else if (message.contains("10029")){
                        error=ZpzOauthResultMsg.customResultStatus(ZpzOauthResultStatus.GATE_WAY_10029);
                    }else if (message.contains("10030")){
                        error=ZpzOauthResultMsg.customResultStatus(ZpzOauthResultStatus.GATE_WAY_10030);
                    }else if (message.contains("10031")){
                        error=ZpzOauthResultMsg.customResultStatus(ZpzOauthResultStatus.GATE_WAY_10031);
                    }else if (message.contains("10040")){
                        error=ZpzOauthResultMsg.customResultStatus(ZpzOauthResultStatus.GATE_WAY_10040);
                    }else if (message.contains("10032")){
                        error=ZpzOauthResultMsg.customResultStatus(ZpzOauthResultStatus.GATE_WAY_10032);
                    }
                }
            }else if (message1.contains("[MYSELF_ERROR]##")){
                error=ZpzOauthResultMsg.error(message1);
            }
        }
        return new ResponseEntity<ZpzOauthResultMsg<Object>>(error, HttpStatus.OK);
    }
    @Override
    public String getErrorPath() {
        return ERROR_PATH;
    }
}
